iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
自我挑戰組

MCU功能介紹與實作系列 第 25

Day 25:SPI通訊

  • 分享至 

  • xImage
  •  

SPI(Serial Peripheral Interface)是一種常見的串列通訊協議,用於在MCU和外部設備之間進行高速數據傳輸。SPI通訊通常用於連接MCU與各種外部設備,如感測器、螢幕、儲存裝置、無線模組等。

基本原理

SPI通訊是一種同步通訊協議,它基於主從(Master-Slave)架構。以下是SPI通訊的基本原理:

**主機(Master):**MCU當主機,生成時鐘訊號並控制數據傳輸。
**從機(Slave):**外部設備(如感測器或儲存裝置)當從機,按照主機的時鐘訊號進行數據傳輸。

SPI通訊使用四條訊號線進行通訊:

  1. SCLK(Serial Clock):主機生成的時鐘訊號,用於同步數據傳輸。
  2. MISO(Master In Slave Out):從機到主機的數據傳輸線,用於將數據從從機傳輸到主機。
  3. MOSI(Master Out Slave In):主機到從機的數據傳輸線,用於將數據從主機傳輸到從機。
  4. CS/SS(Chip Select/Slave Select):選擇要與主機通訊的從機的信號線。當CS/SS訊號為低電位時,表示該從機被選擇。

SPI通訊的用途

SPI通訊廣泛應用於各種嵌入式系統中,其中一些常見的用途包括:

感測器: 連接各種類型的傳感器,如溫度、壓力、陀螺儀等,以獲取數據。
儲存裝置: 用於與儲存裝置(如SD卡)進行通訊,以讀取或寫入數據。
螢幕: 控制OLED螢幕、TFT液晶螢幕等以顯示圖片影像。
通訊模組: 連接無線通訊模組,如Wi-Fi模組、LoRa模組等,以進行通訊。
嵌入式控制: 用於與其他MCU或外部控制器進行通訊,以協調不同部分的工作。

以下是一個基於Arduino的簡單SPI通訊範例程式。

主機端程式碼

#include <SPI.h>

void setup() {
  Serial.begin(9600);
  SPI.begin(); // 初始化SPI通訊
}

void loop() {
  byte dataToSend = 5; // 要發送的數據
  byte receivedData;

  digitalWrite(SS, LOW); // 啟用SPI通訊
  receivedData = SPI.transfer(dataToSend); // 傳送數據並接收回傳數據
  digitalWrite(SS, HIGH); // 停用SPI通訊

  Serial.print("Sent: ");
  Serial.print(dataToSend);
  Serial.print(" | Received: ");
  Serial.println(receivedData);

  delay(1000); // 延遲1秒
}

從機端程式碼

#include <SPI.h>

void setup() {
  SPI.begin(); // 初始化SPI通訊
  pinMode(SS, OUTPUT);
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV4); // 設定SPI時鐘分頻
  SPI.attachInterrupt(); // 啟用SPI中斷
  Serial.begin(9600);
}

byte receivedData;

void loop() {
  if (receivedData == 0) {
    receivedData = SPI.transfer(0); // 接收主機發送的數據
    receivedData = receivedData * receivedData; // 計算平方值
    SPI.transfer(receivedData); // 將計算結果回傳主機
  }
}

上一篇
Day 24:UART通訊
下一篇
Day 26:I2C通訊
系列文
MCU功能介紹與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言